﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.snse
    非线性方程组梯度法
    f(double[] x, double[] y, int n)计算目标函数值以及目标函数n个偏导数的函数名。
    参数 n: n方程个数，也是未知数个数。
    参数 eps: eps控制精度要求。
    参数 x: x[n]存放一组初值。返回一组实数解。
    返回值 函数返回实际迭代次数。若<0则表示因D=0而失败。本函数最大迭代次数为1000。
    */

    public static unsafe string drive_snse()
    {
        int i, k;
        double eps;
        double[] x = new double[3] { 1.5, 6.5, -5.0 };
        eps = 0.000001;

        gl.f_xa_ya_n = snsef;
        k = gl.snse(3, eps, x, 1000);

        return gl.html_table("迭代次数=" + k, x);
    }

    private static unsafe double snsef(double* x, double* y, int n)
    {
        double z, f1, f2, f3, df1, df2, df3;
        //n = n;
        f1 = x[0] - 5.0 * x[1] * x[1] + 7.0 * x[2] * x[2] + 12.0;
        f2 = 3.0 * x[0] * x[1] + x[0] * x[2] - 11.0 * x[0];
        f3 = 2.0 * x[1] * x[2] + 40.0 * x[0];
        z = f1 * f1 + f2 * f2 + f3 * f3;

        df1 = 1.0;
        df2 = 3.0 * x[1] + x[2] - 11.0; df3 = 40.0;
        y[0] = 2.0 * (f1 * df1 + f2 * df2 + f3 * df3);

        df1 = -10.0 * x[1]; 
        df2 = 3.0 * x[0]; 
        df3 = 2.0 * x[2];
        y[1] = 2.0 * (f1 * df1 + f2 * df2 + f3 * df3);
        df1 = 14.0 * x[2]; df2 = x[0]; df3 = 2.0 * x[1];
        y[2] = 2.0 * (f1 * df1 + f2 * df2 + f3 * df3);
        return (z);
    }
}